package com.cyb.crpc;

import com.cyb.crpc.config.RpcConfig;
import com.cyb.crpc.constant.RpcConstant;
import com.cyb.crpc.utils.ConfigUtils;
import lombok.extern.slf4j.Slf4j;

/**
 * 全局配置类
 *
 * @author cyb
 * @date 2024/09/24 09:37
 **/
@Slf4j
public class RpcApplication {
    private static volatile RpcConfig rpcConfig;

    /**
     * 支持自定义配置
     *
     * @param newRpcConfig
     */
    public static void init(RpcConfig newRpcConfig) {
        rpcConfig = newRpcConfig;
        log.info("rpc init, config = {}", newRpcConfig.toString());
    }

    /**
     * 初始化
     */
    public static void init() {
        RpcConfig newRpcConfig;
        try {
            newRpcConfig = ConfigUtils.loadConfig(RpcConfig.class, RpcConstant.DEFAULT_CONFIG_PREFIX);
        } catch (Exception e) {
            newRpcConfig = new RpcConfig();
        }
        init(newRpcConfig);
    }

    /**
     * 获取配置，双检锁单例模式
     * RpcConfig rpc = RpcApplication.getRpcConfig();
     */
    public static RpcConfig getRpcConfig() {
        if (rpcConfig == null) {
            synchronized (RpcApplication.class) {
                if (rpcConfig == null) {
                    init();
                }
            }
        }
        return rpcConfig;
    }
}

